﻿// 5023. 达到回文数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
/*
https://www.acwing.com/problem/content/5026/


给定一个整数 n，从右往左读得到它的反数 m
，请你判断 n与 m的和 s是否是一个回文数。

回文数是从左往右读和从右往左读结果一样的整数。

若 s 不是一个回文数，则继续判断 s和它的反数的和是否是一个回文数。

重复这一过程，直至达到和为一个回文数为止。

例如，如果 n为 195，则 m为 591，s为 786；
再经过以下计算 786+687=1473;1473+3741=5214;5214+4125=9339。

在达到回文数 9339之前总共进行了 4次加法操作。

对于 n，要求计算出达到回文数之前所进行的加法操作的最小次数和最终达到的回文数。

保证 n 本身不是一个回文数。

保证对于 n来说一定能在 1000次加法操作之前达到回文数，并且在计算过程中的和一定小于 2000000000。

输入格式
一个整数 n。

输出格式
共一行，两个整数，表示最小加法次数及最终达到的回文数。

数据范围
1≤n≤10000
输入样例：
195
输出样例：
4 9339
*/

int n;
const int N = 12;
char A[N];
char B[N];

void init() {
	for (int i = 0; i < N; i++) {
		A[i] = '0'; B[i] = '0';
	}
}

void tostr(int n, char A[]) {
	int idx = N - 1;
	while (n) {
		int t = n % 10;
		n /= 10;
		A[idx--] = '0' + t;
	}
}

void reverseStr(char src[], char dst[]) {
	int idx = 0;
	for (idx = 0; idx < N; idx++) {
		if (src[idx] != '0') break;
	}
	int revIdx = N - 1;
	for (int i = idx; i < N ; i++) {
		dst[revIdx] = src[i];
		revIdx--;
	}
}

bool Check(char str[]) {
	int idx = 0;
	for (idx = 0; idx < N; idx++) {
		if (str[idx] != '0') break;
	}

	int l = idx; int r = N - 1;
	while (l < r) {
		if (str[l] != str[r]) return false;
		l++; r--;
	}

	return true;
}

void print(char A[]) {
	int idx = 0;
	for (idx = 0; idx < N; idx++) {
		if (A[idx] != '0') break;
	}

	for (; idx < N; idx++) {
		cout << A[idx];
	}
}

void Add(char A[], char B[]) {
	int next = 0;
	for (int i = N - 1; i >= 0; i--) {
		int a = A[i] - '0';
		int b = B[i] - '0';
		int curr = a + b + next;
		next = curr / 10;
		A[i] = curr % 10 + '0';
	}
}


int ans;
//786+687=1473;1473+3741=5214;5214+4125=9339。
int main()
{
	cin >> n;
	init();
	tostr(n, A);

	reverseStr(A, B);

	while (!Check(A)) {
		ans++;
		reverseStr(A, B);
		Add(A,B);
	}

	cout << ans << " "; print(A);
	cout << endl;

	return 0;
}
 